home *** CD-ROM | disk | FTP | other *** search
- palaste@cc.helsinki.fi wrote on 23-Mai-97:
-
- > how to write a decent arithmetic evaluation routine in AMOS.
-
- I've written some slow evaluation routine a long time ago, but it works
- quite well. You're able to use +, -, *, /, and ^ as operators, brakets, and
- varables, but no functions like sin() or cos().
-
- Dim ELM#(30),CAL(30),PRI(30),VAR$(30),VAR#(30)
- DEZ$="."
- Input CAL$
- For X=0 To 320
- VAR$(0)="x" : VAR#(0)=X
- Gosub CALC
- Plot X,RES#,1
- Next
- End
- CALC:
- R$=Lower$(CAL$)+"="
- COR=0 : ELM=0 : REC=0 : VOZ=1 : NUM=1 : KOM#=1.0
- PRIBAS=0
- For A=1 To Len(R$)
- ER$=""
- A$=Mid$(R$,A,1)
- If COR
- If REC=0
- If A$=")"
- Add PRIBAS,-20
- If PRIBAS<0 : ER$="Too many closing brakets" : End If
- End If
- If Instr("+-*:/^=",A$)
- If NUM
- ELM#(ELM)=ELM#(ELM)*VOZ
- VOZ=1
- Else
- For V=0 To 30
- If Instr(VAR$(V),VAR$)
- ELM#(ELM)=VAR#(V)
- Exit
- End If
- Next
- If V=31 : ELM#(ELM)=0 : ER$="Variable not found" : End If
- ELM#(ELM)=ELM#(ELM)*VOZ
- VOZ=1
- End If
- End If
- If A$="+" : CAL(ELM)=1 : End If
- If A$="-" : CAL(ELM)=1 : VOZ=-VOZ : End If
- If(A$>="a") and(A$<="z") and NUM=1
- CAL(ELM)=2 : Add PRI(ELM),10
- ELM#(ELM)=ELM#(ELM)*VOZ
- VOZ=1
- Inc ELM : REC=1 : COR=0
- End If
- If A$="*" : CAL(ELM)=2 : Add PRI(ELM),10 : End If
- If A$="/" : CAL(ELM)=3 : Add PRI(ELM),10 : End If
- If A$="^" : CAL(ELM)=4 : Add PRI(ELM),15 : End If
- If Instr("+-*:/^",A$)
- Inc ELM : REC=1 : COR=0
- End If
- Else
- If A$="-" : VOZ=-VOZ : End If
- If Instr("*:/^",A$) : ER$="Unexpected operand!" : End If
- End If
- Else
- If A$="(" : Add PRIBAS,20 : End If
- If A$="-" : VOZ=-VOZ : End If
- If Instr("*:/^",A$) : ER$="Unexpected operand!" : End If
- End If
- If(A$>="a" and A$<="z")
- If COR=0
- VAR$=A$ : COR=1 : REC=0 : PRI(ELM)=PRIBAS : NUM=0
- Else
- VAR$=VAR$+A$
- End If
- End If
- If(A$>="0") and(A$<="9")
- If COR=0
- ELM#(ELM)=(Asc(A$)-48) : COR=1 : REC=0 : KOM#=1.0 : PRI(ELM)=PRIBAS
- NUM=1
- Else
- If NUM=0
- VAR$=VAR$+A$
- Else
- If KOM#=1.0
- ELM#(ELM)=ELM#(ELM)*10+(Asc(A$)-48)
- Else
- ELM#(ELM)=ELM#(ELM)+(Asc(A$)-48)/KOM#
- KOM#=KOM#*10.0
- End If
- End If
- End If
- End If
- If A$=DEZ$
- If NUM
- If KOM#=1.0
- KOM#=10.0
- If COR=0
- ELM#(ELM)=0.0 : COR=1 : REC=0
- End If
- Else
- ER$="Decimal point error!"
- End If
- Else
- VAR$=VAR$+A$
- End If
- End If
- If ER$<>"" Then Print ER$
- Next
- ELM#(ELM)=ELM#(ELM)*VOZ
- E=ELM
- While ELM>0
- For A=0 To ELM
- If PRI(A)>=PRI(A+1)
- If CAL(A)=1 : ELM#(A)=ELM#(A)+ELM#(A+1) : End If
- If CAL(A)=2 : ELM#(A)=ELM#(A)*ELM#(A+1) : End If
- If CAL(A)=3 : ELM#(A)=ELM#(A)/Max(ELM#(A+1),0.001) : End If
- If CAL(A)=4 : ELM#(A)=ELM#(A)^ELM#(A+1) : End If
- PRI(A)=0 : CAL(A)=CAL(A+1)
- If A<ELM
- For B=A+1 To ELM
- ELM#(B)=ELM#(B+1) : CAL(B)=CAL(B+1) : PRI(B)=PRI(B+1)
- Next
- End If
- Dec ELM
- Exit
- End If
- Next
- Wend
- RES#=ELM#(0)
- Return
-
- --
- Best Regards,
- _____ __ _ __ ______ ___ __ __ __
- |"(" \()/" ) (_)/" )(" \()/\" \(__)/" ) /" )
- | ) )/ / / /| \______)/" \ \ / /|/ /
- | (___// / / /"| |" | ( (_\__)/ /"/ /
- | | / /"\ / / | _ | | _\ / // /|/ /__
- |__| (__/___)(__/|__|(_)|__|(_)\/__/(__/ (__/(MM)
-
-
-
-
-